package com.tedu.day02.oop;

/**
 * 抽象类：抽象类与抽象方法一起说   关键字：abstract
 * 类：只能提供行为概念，没有具体的实现行为
 *
 * 抽象类与面向对象--多态绝对的关系【向上造型】
 * 使用多态创建抽象类对象，抽象类本身无法创建对象，需要使用多态创建对象
 *
 * 什么情况下会使用抽象类？
 * 复杂项目时：需要在不同类下实现不同的功能，首先抽象类【Android常用】
 *
 * 定义抽象类与抽象方法：
 * 抽象类：修饰符 abstract class 类名{}  ---毫无意义，必须结合抽象方法
 * 抽象方法：修饰符 abstract 返回值 方法名 (参数)；--没有具体的实现
 *
 * 抽象类的“实例化对象（创建对象）”：抽象类自身无法实例化
 * ①创建子类【N个】，继承抽象【父】类，子类一定实现抽象【父】类的所有抽象方法
 * ②使用面向对象：多态【向上造型】 抽象类 引用=new 【实现】子类（）；
 *注意：抽象类一定发生重写，子类继承抽象【父】类，也可以叫做“实现类"
 */

abstract  class Animals{ //抽象类
    //抽象方法:没有具体的实现【代码块】---一定继承---一定是多态性【向上造型】
    public abstract void say();
    //①定义由final修饰的抽象方法吗?   错  因为没有任何实现，定什么
    //public final abstract   void sleep();
    //②定义一个抽象的变量？   错
    //abstract int i=1;
    //③定义静态变量？   对
   // static int i=1;
    //④定义一个静态的抽象变量吗？  错
    //static abstract int i=1;
    //⑤定义静态的抽象方法【无实现】     错
    //public static abstract void say1();
    //⑥定义静态的方法【无实现:空的代码块】
    //public static  void say1(){};
    //⑤⑥总结：抽象方法/静态方法，方法定义：修饰符static/abstract（二选一）  返回值 方法名
    //⑦可以定义内部类：静态内部类  对
    //static class sos{}
    //⑧抽象类有构造器吗？  有

//    public Animals() {
//    }

    //⑨抽象类可以有普通方法吗？  可以
 public void run(){};

}
//⑩抽象类可以继承抽象类吗？  实现：两个抽象类--形容--一个实现   对
abstract  class Thing extends Animals{
    public abstract void sleep();
}
//目的：两个抽象类中所有的抽象方法---继承子抽象类

    //实现类：实现抽象类【父类级别】的方法---多个实现类--继承--抽象
class Person1 extends Animals{//报错原因：完成重写
    @Override
    public void say() {
        System.out.println("人---说话---");
    }

}
public class 抽象类 {
    public static void main(String[] args) {
        //抽象类无法实例化:只提供抽象方法，并且由子类实现---用多态【造型】
        Animals a=new Person1();
        a.say();//向上造型--重写父类抽象的方法【完成覆盖】
    }
}
